package com.will.willaicodemother.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.will.willaicodemother.model.dto.app.AppAddRequest;
import com.will.willaicodemother.model.dto.app.AppQueryRequest;
import com.will.willaicodemother.model.entity.App;
import com.will.willaicodemother.model.entity.User;
import com.will.willaicodemother.model.vo.AppVO;
import reactor.core.publisher.Flux;

import java.util.List;

/**
 * 应用 服务层。
 *
 * @author will
 * @since Sun Aug 10 17:17:42 CST 2025
 */
public interface AppService extends IService<App> {


    /**
     * 获取应用 VO 分装类
     *
     * @param app 应用类
     * @return 应用 VO 分装类
     */
    AppVO getAppVO(App app);


    /**
     * 获取应用 VO 分装类列表
     *
     * @param appList 应用类列表
     * @return 应用 VO 分装类列表
     */
    List<AppVO> getAppVOList(List<App> appList);

    /**
     * 获取查询条件
     *
     * @param appQueryRequest 应用查询条件
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(AppQueryRequest appQueryRequest);

    App createApp(AppAddRequest appAddRequest, User loginUser);

    /**
     * 通过聊天生成应用代码
     *
     * @param appId 应用 id
     * @param userMessage 用户消息
     * @return 流输出
     */
    Flux<String> chatToGenCode(Long appId, String userMessage, User loginUser);

    /**
     * 应用部署
     * @param appId 应用 id
     * @param loginUser 登录用户
     * @return 可访问的部署地址
     */
    String deployApp(Long appId, User loginUser);

    /**
     * 启动虚拟现成异步执行应用截图,并更新应用封面
     * @param appId 应用id
     * @param appDeployUrl 应用部署地址
     */
    void generateAppSreenshotAysnc(Long appId, String appDeployUrl);

    boolean deleteAppFile(App oldApp);
}
